from datetime import datetime
from django.shortcuts import render
from rest_framework.generics import ListAPIView, RetrieveAPIView, GenericAPIView
from rest_framework.permissions import IsAuthenticated
from rest_framework.response import Response

from backend.apps.gathering.models import Gathering
from backend.apps.gathering.serializers import GatherSerializer, GatherSerializerSimple




# 获取所有活动列表
class GathersView(ListAPIView):
    # 序列化器
    serializer_class = GatherSerializerSimple
    # 查询集,注意：state是判断所有可见的活动
    queryset = Gathering.objects.filter(state=1)

    def list(self, request, *args, **kwargs):
        queryset = self.filter_queryset(self.get_queryset())


        page = self.paginate_queryset(queryset)
        if page is not None:
            serializer = self.get_serializer(page, many=True)
            dict_data = []
            for dict in serializer.data:
                dict['image'] = 'http://' + dict['image'][41: ]
                dict_data.append(dict)
            print(dict_data)

            return self.get_paginated_response(dict_data)

        serializer = self.get_serializer(queryset, many=True)

        dict_data = []
        for dict in serializer.data:

            dict['image'] = 'http://' + dict['image'][41: ]
            dict_data.append(dict)
        print(dict_data)

        return Response(dict_data)

# 获取某一个活动的详情页
class GatherView(RetrieveAPIView):
    # 序列化器
    serializer_class = GatherSerializer
    # 查询集
    queryset = Gathering.objects.filter(state=1)



# 用户报名参加或取消哪一个活动
class GatherJoinView(GenericAPIView):
    # 权限检查类
    permission_classes = [IsAuthenticated]
    # 查询集
    queryset = Gathering.objects.filter(state=1)


    # 添加判断
    def post(self, request, pk):
        user = request.user
        # 获取视图对象
        gathering = self.get_object()
        # 获取当前时间
        now = datetime.now()
        # 获取活动的报名截止日期
        endtime = gathering.endrolltime.replace(tzinfo=None)

        # 判断：如果报名截止的时间小于当前时间
        if endtime < now:
            return Response({'success': False, 'message': '报名时间已过'}, status=400)

        else:
            # 如果报名时间没过，那就可以报名或者取消报名,
            # 在点击报名或取消报名之前还要进行判断：
            # 上数据库里查询看当前这个用户是否在这个数据库中
            if user in gathering.users.all():
                # 如果数据库中有当前用户就代表他已经报名过了 ，如果他要取消报名的话 就把他从数据库中删除
                gathering.users.remove(user)
                # 保存
                gathering.save()
                # 返回响应结果   success 和 message 是接口文档上要求返回的
                return Response({'success': True, 'message': '取消成功'})

            else:
                # 如果数据库中没有当前用户的话 ，如果他要报名 就把他添加到数据库中
                gathering.users.add(user)
                # 保存
                gathering.save()
                # 返回响应结果
                return Response({'success': True, 'message': '报名成功'})